

import bpy
import numpy as np

import mathutils
import math


import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
import 全局控制.Node.插座.bl_插座基类 as 插座基类
import Core.bl_维度转换 as 维度转换

from 节点.Core import bl_UI配色

from 物体.物理管理.车辆 import bl_车辆数据

import engine.initLIB.load_dll as engineLib
import ctypes


import pdb


engineLib.flexCAPI.f_创建车轮节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建车辆节点.restype = ctypes.c_bool









class C_Node_Px车轮(基类.C_Node_基类):
	bl_dname = 'bl_node_Px车轮'
	bl_label = 'PhyaX 车轮'
	#m_Code = bpy.props.StringProperty()
	m_对称 = bpy.props.BoolProperty(default=False)

	m_半径 = bpy.props.FloatProperty()
	m_重量 = bpy.props.FloatProperty()
	m_精度 = bpy.props.FloatProperty()

	m_手刹强度 = bpy.props.FloatProperty()
	m_最大转向角度 = bpy.props.FloatProperty()

	def init(self, context):
		super(C_Node_Px车轮, self).f_init(context)

		self.inputs.new('C_Socket_I32', name='物理场景ID')
		self.inputs.new('C_Socket_物理材质', name='物理材质')
		self.inputs.new('C_Socket_物理体', name='碰撞几何')

		self.inputs.new('C_Socket_F32_Array1D', name='半径')
		self.inputs.new('C_Socket_F32_Array1D', name='宽度')
		self.inputs.new('C_Socket_I32_Array1D', name='精度')

		self.inputs.new('C_Socket_Vec3_Array1D', name='偏移坐标')
		
		self.inputs.new('C_Socket_F32_Array1D', name='重量')
		self.inputs.new('C_Socket_F32_Array1D', name='手刹强度')
		self.inputs.new('C_Socket_F32_Array1D', name='最大转向角度')
		
		self.inputs.new('C_Socket_F32_Array1D', name='静止状态外倾角')
		self.inputs.new('C_Socket_F32_Array1D', name='最大下垂外倾角')
		self.inputs.new('C_Socket_F32_Array1D', name='最大压缩外倾角')
		
		self.inputs.new('C_Socket_Vec3_Array1D', name='悬挂压缩方向')
		self.inputs.new('C_Socket_I8_Array1D', name='安装方位')
		
		
		self.outputs.new('C_Socket_车轮', name='车轮属性')
		
		self.f_toCPP(self.id_data)

		#设置默认值
		self.inputs['半径'].f_setData(0.25)
		self.inputs['宽度'].f_setData(0.2)
		self.inputs['重量'].f_setData(25)
		self.inputs['精度'].f_setData(64)

		self.inputs['手刹强度'].f_setData(4000.0)
		self.inputs['最大转向角度'].f_setData(30)

		
		self.inputs['静止状态外倾角'].f_setData(0.0)
		self.inputs['最大下垂外倾角'].f_setData(0.3)
		self.inputs['最大压缩外倾角'].f_setData(-0.3)

		self.inputs['偏移坐标'].f_setData((0.0,-1.0,0.0))
		self.inputs['悬挂压缩方向'].f_setData((0.0,-1.0,0.0))
		#print('AAAAAAAAAAAAAAAAAAA self.inputs = ', self.inputs)


	def f_toCPP(self, tree):
		未创建 = engineLib.flexCAPI.f_创建车轮节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 未创建 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_物理节点颜色
			
			节点 = ctypes.py_object([list(tree.name), list(self.name)])
			插座初始化数据 = ctypes.py_object([
				(list('半径'), [list('初始值'), 0.25]), (list('重量'), [list('初始值'), 25]), 
				(list('宽度'), [list('初始值'), 0.2]), (list('精度'), [list('初始值'), 64]),
				(list('手刹强度'), [list('初始值'), 4000.0]), (list('最大转向角度'), [list('初始值'), 30]),
				(list('静止状态外倾角'), [list('初始值'), 0.0]), (list('最大下垂外倾角'), [list('初始值'), 0.3]), (list('最大压缩外倾角'), [list('初始值'), -0.3]),
				(list('偏移坐标'), (0.0,-1.0,0.0)), (list('悬挂压缩方向'), (0.0,-1.0,0.0))
			])
			engineLib.flexCAPI.f_set节点插座数据(节点, 插座初始化数据, ctypes.c_bool(False))

			for s in self.inputs:
				s.f_update()


	def update(self):
		super(C_Node_Px车轮, self).update()
		if len(self.inputs) < 15 : return;

		if self.inputs['碰撞几何'].is_linked :
			self.inputs['半径'].enabled = False
			self.inputs['偏移坐标'].enabled = False
		else:
			self.inputs['半径'].enabled = True
			self.inputs['偏移坐标'].enabled = True

	def f_update(self):
		#if self.inputs['车轮物体'].is_linked :
		return



class C_NODE_AddMenu_Px车轮(bpy.types.Operator):
	bl_idname = 'node.global_node_add_wheels'
	bl_label = '添加车轮'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_Px车轮', use_transform=True)
		return {'FINISHED'}





















class C_Node_Px车体(基类.C_Node_基类):
	bl_dname = 'bl_node_Px车'
	bl_label = 'PhyaX 车'

	m_Code = bpy.props.StringProperty()
	m_车身 = bpy.props.PointerProperty(type=bpy.types.Object)
	
	
	def init(self, context):
		super(C_Node_Px车体, self).f_init(context)
		self.inputs.new('C_Socket_I32', name='物理场景ID')
		
		self.inputs.new('C_Socket_物理材质', name='车体材质')
		self.inputs.new('C_Socket_物理体', name='车体碰撞')
		
		self.inputs.new('C_Socket_F32', name='底盘重量')
		self.inputs.new('C_Socket_F32', name='引擎最大扭矩')
		self.inputs.new('C_Socket_F32', name='引擎最大转速')
		self.inputs.new('C_Socket_F32', name='变速换挡时间')
		self.inputs.new('C_Socket_Vec3', name='底盘边界')
		self.inputs.new('C_Socket_Vec3', name='车体位置')
		self.inputs.new('C_Socket_Vec3', name='重心偏移')
		
		self.inputs.new('C_Socket_车轮', name='车轮')
		self.inputs.new('C_Socket_I32', name='数量')
		
		self.outputs.new('C_Socket_车辆', name='车辆物理体')
		self.outputs.new('C_Socket_物理体_Array1D', name='车体物理体')
		self.outputs.new('C_Socket_物理体_Array1D', name='车轮物理体')
		
		self.f_toCPP(self.id_data)

		#设置默认值
		self.inputs['引擎最大扭矩'].f_setData(600)
		self.inputs['引擎最大转速'].f_setData(8000)
		self.inputs['底盘重量'].f_setData(1500)
		self.inputs['底盘边界'].f_setData([1.6, 1.0,3.5])
		self.inputs['重心偏移'].f_setData([0.0,-0.5,0.0])
		
		self.inputs['数量'].f_setData(1)
		
		
		#基类.f_input插座动态增减(self, 8, 'C_NodeSocket_车轮', '车轮')
	def f_toCPP(self, tree):
		未创建 = engineLib.flexCAPI.f_创建车辆节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 未创建 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_物理节点颜色
			#print('self.inputs = ', self.inputs)
			
			节点 = ctypes.py_object([list(tree.name), list(self.name)])
			插座初始化数据 = ctypes.py_object([
				(list('引擎最大扭矩'), 600), (list('引擎最大转速'), 8000),
				(list('底盘重量'), 1500.0), 
				(list('底盘边界'), (0.0,-1.0,0.0)), (list('重心偏移'), (0.0,-1.0,0.0)),
				(list('数量'), 1),
			])
			engineLib.flexCAPI.f_set节点插座数据(节点, 插座初始化数据, ctypes.c_bool(False))
			
			for s in self.inputs:
				s.f_update()

			
class C_NODE_AddMenu_Px车体(bpy.types.Operator):
	bl_idname = 'node.global_node_add_car_rigid_body'
	bl_label = '添加车体'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_Px车体', use_transform=True)
		return {'FINISHED'}




classes = (
	C_Node_Px车轮,
	C_NODE_AddMenu_Px车轮,

	C_Node_Px车体,
	C_NODE_AddMenu_Px车体,
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)

	









